#ifndef _MESSAGE_H
#define _MESSAGE_H

#include<arpa/inet.h>
#include<iostream>

#include<cstring>
using namespace std;
// 定义操作类型
#define REGISTER 1  // 注册
#define LOGIN 2     // 登录
#define LOGOUT 3    // 登出
#define SELECT 4    // 查询
#define HISTORY 5   // 历史

struct Msg
{
    int type;   //操作类型
    char name[20];  // 用户名
    char text[128]; // 文本内容

    Msg(): type(0), name(""), text("") {}

    static const size_t getLen()
    {
        return sizeof type + sizeof name + sizeof text;
    }

    /// @brief 长整数的主机字节序转网络字节序
    void hton()
    {
        type = move(htonl(type));
    }
    /// @brief 长整数的网络字节序转主机字节序
    void ntoh()
    {
        type = move(ntohl(type));
    }

    // 序列化函数
    string Serialization()
    {
        return string(reinterpret_cast<const char *>(&type), sizeof type) + string(name, sizeof name) +
        string(text, sizeof text);
    }

    void Reserialization(const string& data)
    {
        Reserialization(data.c_str());
    }

    void Reserialization(const char * data)
    {
        int start = 0;
        type = *reinterpret_cast<const int *>(data);
        start += sizeof type;

        memcpy(name, data + start, sizeof name);
        start += sizeof name;

        memcpy(text, data + start, sizeof text);
        start += sizeof text;
    }
};

#endif